from scrapy import cmdline
from scrapy.utils.project import get_project_settings

from amac_spider.utils import insert
from amac_spider.utils.handler import get_url, get_cls


helper = '''
        语法：
            -- name 爬虫名称  --role 任务类型
        
        指令：
            --name       爬虫名称(必选参数)
            --role       启动类型，1表示插入指定爬虫的初始URL任务，2表示启动指定爬虫任务，all表示插入
                         所有爬虫的初始URL，注意：当role为all时，--name可以任意指定，但是必须是存在的
                         爬虫名称(必选参数)
            --help       查看帮助信息
        
        当前存在爬虫：
            aoin_product            证券公司直投基金
            pof_subfund             证券公司私募投资基金
            cancelled_manager       已注销私募基金管理人名单
            pof_person              基金从业人员资格注册信息
            pof_securities          证券公司集合资管产品公示
            fund_account            基金公司及子公司集合资管产品公示
            mutual_fund_manager     公募基金管理人名录
            fund_manager            私募基金管理人名录
        '''


class ParseCommand(object):

    def __init__(self, command):
        self.command_list = ['--name', '--role', '--help']
        self.spider_name_list = list(get_project_settings().get('FIRST_URL_MAPPING').keys())
        self.command = command

    def print_info(self, info):
        print(info)
        exit(0)

    def parse(self):
        args_dict = {}
        for index in range(1, len(self.command), 2):
            if self.command[index+1] in self.command_list:
                info = '缺少"{}"参数，请检查命令'.format(self.command[index])
                self.print_info(info)
            args_dict[self.command[index]] = self.command[index+1]
        return args_dict

    def handler(self):
        global helper

        if len(self.command) == 1:
            info = '缺少参数，可通过--help查看帮助信息'
            self.print_info(info)
        if self.command[1] == '--help':
            self.print_info(helper)
        if len(self.command) % 2 == 0:
            info = '缺少参数，可通过--help查看帮助信息'
            self.print_info(info)
        if not self.command[1].startswith('--'):
            info = '命令不正确，可通过--help查看命令格式'
            self.print_info(info)

        info = self.parse()
        name = info.get('--name', None)
        role = info.get('--role', None)

        if name not in self.spider_name_list:
            info = '不存在【{}】这个爬虫，请检查爬虫名称是否正确，当前存在的爬虫有：{}。也可通过--help命令查看'.format(name, self.spider_name_list)
            self.print_info(info)
        if role is None:
            info = '缺少role参数，可通过--help查看帮助信息'
            self.print_info(info)
        if role not in ['1', '2', 'all']:
            info = 'role参数只接受1，2或all，不接受其他'
            self.print_info(info)

        return name, role

    def run_insert(self, name):
        insert_cls = getattr(insert, get_cls(name))
        url = get_url(name)
        o = insert_cls(name, url)
        o.run()

    def run(self):
        name, role = self.handler()
        if role == '1':
            print('========== start {} master =========='.format(name))
            self.run_insert(name)
        elif role == 'all':
            print('========== start all master ==========')
            for name in self.spider_name_list:
                self.run_insert(name)
        else:
            print('========== start {} worker =========='.format(name))
            cmd = 'scrapy crawl {}'.format(name)
            cmdline.execute(cmd.split(' '))